package epoch.game.core.distr.service;

import epoch.game.core.action.IAction;
import epoch.game.core.distr.NodeType;
import epoch.game.core.distr.call.Call;

/**
 * 分布式服务接口，要实现分布式服务，必须实现该接口
 * @author will
 * @date 2016年4月8日 上午10:32:01
 */
public interface IService {
	
	/**
	 * 获取服务id
	 * @return
	 */
	int getId();
	
	/**
	 * 服务状态
	 * @return
	 */
	ServiceStatus getStatus();
	
	/**
	 * 初始化
	 * @param serviceId 服务id
	 * 
	 */
	void init(int serviceId) throws Exception;
	
	/**
	 * 启动服务
	 */
	boolean start();
	
	/**
	 * 停止服务
	 */
	void stop();
	
	/**
	 * 服务心跳
	 */
	void tick(long tickTime);

	/**
	 * 获取服务方法
	 * @param methodKey
	 * @return T 返回函数接口
	 */
	Object getMethod(short methodKey);
	
	/**
	 * 执行远程请求
	 * @param call
	 */
	void doCall(Call call);
	
	void addAction(IAction action);

	boolean getNodeNotify();
	
	void onNodeRegister(int nodeId, String nodeName, String host, int port, NodeType type);
	
	void onNodeUnregister(int nodeId, NodeType type);
}
